VideoPageZeroBuffer	times 0fa0h	db	0	
A	db	0
X	dw	0
Y	dw	0
;
;	�������������� ������� ������
;	-------------------------------------
;�����: AL - 0 - ��������� �������������, 1-��������� ���������������
;	DL - ���� ���� (0<=DL<=15)
;	DH - ���� ������� (0<=DH<=7)
;
ScreenDriverInit:                    
        push	ax
	push	cx
	push	dx
	push	di
	push	si
	push	ds
	push	es
	cmp	al,0			;���� �� ����� AL = 0 �� ���������
	jz	.M1			; �������������, ����� ���������������
;�������������� ������� �������������
	cld				;DF <- 0
	mov	si,VideoPageZeroBuffer	;������ ����������
	mov	ax,0b800h		;���� ����������
	mov	es,ax			; �������
	mov	di,0h			; ��������
	mov	cx,0fa0h		;������� ���� ���������� (4000)
rep	movsb				;����������� ������� ������
	jmp	.Exit		        ;�����
;���������� ������� �������������
.M1:	cld                             ;DF <- 0
	mov	ax,0b800h		;������ ����������
	mov	ds,ax                   ; �������
	mov	si,0h			; ��������
	mov	di,VideoPageZeroBuffer  ;���� ����������
	mov	cx,0fa0h                ;������� ���� ���������� (4000)
rep	movsb                           ;����������� ������� ������
;��������� ���������� ����� ��������� � ��� ������ � ���������� �
	sal	dl,3                    ;����� ����� �� 3 �������
	or	dl,dh                   ;����������� ���� � ����� � ����� �����
	mov	[es:A],dl		;���������� � ����� ��������� ����������� ��������
;������� ������� ������������� ����� ���������� �� ��������� �������
	mov	si,0h                   ;SI <- 0
	mov	cx,0fa0h                ;CX <- 4000
.loop:	mov	[si],byte 20h           ;�������� � ������ ���� ����������� �������
	inc	si			;SI <- SI + 1
	mov	[si],dl                 ;�������� � �� ������ ���� ����������� ��������� ������ �������
	inc	si			;SI <- SI + 1
	loop	.loop                   ;���� ���� CX != 0
;������� ������� ������������� � �������� ������������ �� ������
	mov	al,0ch			;�������� ����� �������� (12)
	mov	dx,3d4h                 ; � ���� 3D4h (��������� �������)
	out	dx,al                   ;
	mov	al,0                    ;�������� 0
	mov	dx,3d5h                 ; � ���� 3D5h (������� ������)
	out	dx,al                   ;
	mov	al,0dh                  ;�������� ����� �������� (13)
	mov	dx,3d4h                 ; � ���� 3D4h (��������� �������)
	out	dx,al                   ;
	mov	al,0                    ;�������� 0
	mov	dx,3d5h                 ; � ���� 3D5h (������� ������)
	out	dx,al                   ;
;������� ����������� ������� �������
	mov	al,0ah			;�������� ����� �������� (10)
	mov	dx,3d4h			; � ���� 3D4h (��������� �������)
	out	dx,al
	mov	al,9h			;�������� 9 (��������� ������ �������)
	mov	dx,3d5h                 ; � ���� 3D5h (������� ������)
	out	dx,al
	mov	al,0bh			;�������� ����� �������� (11)
	mov	dx,3d4h                 ; � ���� 3D4h (��������� �������)
	out	dx,al
	mov	al,0eh			;�������� 14 (�������� ������ �������)
	mov	dx,3d5h                 ; � ���� 3D5h (������� ������)
	out	dx,al
;������ ������� �������� � ���������� X � Y
	mov	[es:X],word 0		;X <- 0
	mov	[es:Y],word 0		;Y <- 0
;��������� ������� � ��������� ������� ������
	call	SettingCursor
;�����
.Exit:	pop	es
	pop	ds
	pop	si
	pop	di
	pop	dx
	pop	cx
	pop	ax
	ret
;
;	����� ������� �� �����
;	----------------------
; �����: AL - ������ ��� ������ �� �����
;
CharacterOutput:
	push	ax
	push	bx
	push	dx
	push	si
	push	ds
	push	es		
	mov	bx,cs
	mov	es,bx
;���� ������ "������� ������"
	cmp	al,0ah			;���� � AL ������ �� "������� ������" 
	jne	.M1                     ; ���� ������
	add	[es:Y],word 1		; ����� ����������� Y �� 1
	jmp	.M3                     ;��������� � .�3
;���� ������ "������� �������"
.M1:	cmp	al,0dh			;���� � AL ������ �� "������� �������" 
	jne	.M2                     ; ���� ������
	mov	[es:X],word 0           ; ����� � X �������� 0
	jmp	.M3                     ;��������� � .�3
;������ ������� � ��� ��������� � �����������
.M2:	mov	bl,al                   ;���������� ������ � BL
;	��������� ������� � �����������
	mov	ax,0b800h               ;������������� � ������� ������
	mov	ds,ax			; ������� �����������
	xor	ax,ax                   ;AX <- 0
	mov	ax,80			;AL <- 80
	mul	word [es:Y]             ;AL <- AL * Y
	add	ax,[es:X]               ;AL <- AL + X
	mov	dx,2			;DL <- 2
	mul	dx	                ;AL <- AL * DL
        mov	si,ax                   ;SI <- AX
;	�������� ������ � �����������
	mov	al,bl                   ;AL <- BL
	mov	[si],al			;�������� � ���������� ����� ������� ������ ������ ��� ������
	inc	si                      ;SI <- SI + 1
	mov	bl,[es:A]               ;BL <- �������� ������
	mov	[si],bl                 ;�������� � ���������� ����� ������� ������ �������� ������
	add	[es:X],word 1           ;X <- X + 1
	cmp	[es:X],word 80		;���� X �� ����� 80
	jne	.M3			; �� ��������� .�3
	mov	[es:X],word 0		;����� X <- 0
	add	[es:Y],word 1		; Y <- Y + 1
;���� Y = 25
.M3:	cmp	[es:Y],word 25          ;���� Y �� ����� 25
	jne	.M4			; �� ��������� .�4
	mov	[es:Y],word 0		;����� Y <- 0
;��������� �������
.M4:	call	SettingCursor           ;����������� ������
;�����
	pop	es
	pop	ds
	pop	si
	pop	dx
	pop	bx
	pop	ax
	ret	
;
;	��������� �������
;	-----------------
;
SettingCursor:
	push	ax
	push	bx
	push	dx
;��������� ������� �������
	xor	ax,ax			;AX <- 0
	xor	bx,bx			;BX <- 0
	mov	ax,80			;AL <- 80
	mul	word [es:Y]		;AL <- AL * Y
	mov	bx,word	[es:X]		;BL <- X
	add	bx,ax			;BX <- BX + AX
;�������� ������� ������� �����������
	mov	al,0fh			;�������� ����� �������� (15)
	mov	dx,3d4h                 ; � ���� 3D4h (��������� �������)
	out	dx,al                   ;
	mov	al,bl			;�������� ������� ���� ������� �������
	mov	dx,3d5h                 ; � ���� 3D5h (������� ������)
	out	dx,al                   ;
	mov	al,0eh                  ;�������� ����� �������� (14)
	mov	dx,3d4h                 ; � ���� 3D4h (��������� �������)
	out	dx,al                   ;
	mov	al,bh                   ;�������� ������� ���� ������� �������
	mov	dx,3d5h                 ; � ���� 3D5h (������� ������)
	out	dx,al                   ;
;�����
	pop	dx
	pop	bx
	pop	ax
	ret